package com.ww.learn.coroutine.cancel

import kotlinx.coroutines.*

// 打印结果
//job: I'm sleeping 0 ...
//main: I'm tired waiting!
//main: Now quit...
fun main() = runBlocking {
    /**
     * 两种方法取消执行的计算代码
     * 1、定期调用挂起函数来检测取消，这种目的yield是一个好的选择
     * 2、显式的检查取消状态
     * 这里使用第二种写法
     */
    val startTime = System.currentTimeMillis()
    val job = launch(Dispatchers.Default) {
        var nextPrintTime = startTime
        var i = 0
        // isActive是一个可以被使用在CoroutineScope中的扩展属性
        while (isActive) { // 可以被取消的计算循环
            if (System.currentTimeMillis() >= nextPrintTime) {
                println("job: I'm sleeping ${i++} ...")
                nextPrintTime += 500L
            }
        }
    }

    com.ww.learn.coroutine.delay(1300L) //
    println("main: I'm tired waiting!")
    job.cancelAndJoin()
    println("main: Now quit...")
}